20
תגובות

nginx - נתיבי גלישה

פתח PHPDeveloper ,
היי
אני בניתי לאחרונה פריימוורק בשבילי כדי לבדוק את היכולות שלי בעבודה על פרוייקטים בינוניים.
אני עובד על שרת UBUNTU עם NGINX

עכשיו לפיירמוורק שלי יש נתיבי גלישה כמו /Master/Do כאשר אני ניכנס לURL הזה (127.0.0.1/Master/Do) זה זורק אותי לשגיאה 404. לפי מה שאני חושב זה פשוט מחפש תיקיה ולא הולך על פי הקונטרולר.

השתמשתי בCONFIG של NGINX בתקווה שזה ישנה את זה

http://pastebin.com/jbAnPzAm

אבל לא קרה כלום

20 תשובות

avatar ענה shlomo120 ב 09 לדצמבר 2012 #

אולי תרשום משהו כזה בקובץ htaccess ?

RewriteRule ^(.+)$ index.php?fwAction=$1 [QSA,L]

avatar ענה intval ב 09 לדצמבר 2012 #

תנסה ככה:

location ~ \.php$
  {
    # Filter out arbitrary code execution
    location ~ \..*/.*\.php$ {return 404;}
    try_files $uri =404;
   
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

    fastcgi_param PATH_INFO $fastcgi_path_info;

    include fastcgi_params;
    set $memcached_key "ubuntu:$request_uri";
    memcached_pass 127.0.0.1:11211;
   
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
   
    break;
  }

avatar ענה PHPDeveloper ב 10 לדצמבר 2012 #

אלכס זה עדיין לא עוזר.
404 Not Found

nginx/1.1.19
ביטלתי גם את cgi.fix_pathinfo שהיה אצלי על 1

avatar ענה PHPDeveloper ב 10 לדצמבר 2012 #

אולי הבעיה היא בפריימוורק שלי? יכול להיות שמציאת נתיבים בפריימוורק שלי לא נכונים?
זה הקוד שלי, תגידו מה דעתכם:

class Router {

    private $controller = null;
    private $actionMethod = null;
   
    private $baseUrl = null;
   
    /*
     * __construct function;
     * Are there any files in the Main folder
     */

   
    public function __construct() {
        $files = glob(Config::read('controllers').'*.php');
        if(!$files) throw new
            tException("Router", "ERROR: can't find any controllers");
       
        foreach($files as $file)
            require_once $file;
    }
   
     /*
     * __construct function;
     * Getting data vars from the url
     */

   
    public function pathRouter() {
       
        $requestUrl = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $requestString = substr($requestUrl, strlen($this->baseUrl));

        $urlParams = explode('/', $requestString);

        $this->controller = ucfirst(array_shift($urlParams)) . 'Controller';
        $this->actionMethod = strtolower(array_shift($urlParams)) . 'Action';
       
        return array("controller"=>$this->controller, "action"=>$this->actionMethod);
    }

}

avatar ענה intval ב 10 לדצמבר 2012 #

לא משנה מה הקוד שלך.
משנה האם כל הבקשות מגיעות ל index.php או לא.
מה כתוב באותו index.php פחות מעניין. מצידי שיהיה שם echo 'hi';

הקונפיג שצירפתי אמור להביא אותך ל index.php בכל בקשה, אבל אם זה לא קורה
צריך לראות בלוגים מה nginx חושב שכן קורה.
תעיף מבט ב error.log ו access.log של nginx ותצרף לפה את הכמה שורות האחרונות שנכתבות לשם אחרי שאתה גולש לנטיב כלשהו.

avatar ענה intval ב 11 לדצמבר 2012 #

לא צריך את כל הerror-log.
צריך שתמחק ממנו הכל, תנסה לגלוש ותצרף לפה רק את מה שקורה אחרי שאתה מנסה לגלוש.
מה השרת עשה שבוע שעבר לא באמת מעניין.

avatar ענה PHPDeveloper ב 11 לדצמבר 2012 #

טוב זה מה שמופיע לי בACCESS LOG:

192.168.0.104 - - [10/Dec/2012:21:43:41 +0200] "GET /dcframework/Master/Do HTTP/1.1" 404 200 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"
192.168.0.104 - - [10/Dec/2012:21:43:41 +0200] "GET /favicon.ico HTTP/1.1" 404 200 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"
192.168.0.104 - - [10/Dec/2012:21:43:57 +0200] "-" 400 0 "-" "-"


עכשיו לגבי הלוג של השגיאות - במידה ואני ניכנס לתיקיה הראשית של הפריימוורק ללא נתיבים לקונטרולר הוא כותב לי את זה:
2012/12/10 21:45:39 [error] 2538#0: *3 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Class 'Http:Controller' not found in /usr/share/nginx/www/dcframework/framework/Routes/Controllers.php on line 15" while reading response header from upstream, client: 192.168.0.104, server: ubuntu, request: "GET /dcframework/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "192.168.0.102"


ופולט לי בדפדפן את זה -
Array ( [controller] => Http:Controller [action] => Action ) Fatal error: Class 'Http:Controller' not found in /usr/share/nginx/www/dcframework/framework/Routes/Controllers.php on line 15


אבל כשאני ניכנס לנתיב של הקונטרולר /Home אין שום שגיאה למרות שאני מקבל 404.

avatar ענה intval ב 11 לדצמבר 2012 #

אז תיכנס לנטיב שנותן לך את ה-404.
אם הבקשה הגיע אל הסקריפט שלך והוא לא עובד - אתה מתקן את הסקריפט.
אם הבקשה לא הגיע לסקריפט שלך למרות שהיא הייתה אמורה - אנחנו ביחד מתקנים את קונפיג של השרת.

אם אתה נמצא במקרה הראשון, השאלה סגורה מבחינתי.
אם אתה נמצא במקרה השני, אני צריך את הלוגים של מה שקורה. אחת אנחנו לא יודעים מה באמת השרת חושב שהוא עושה.

avatar ענה PHPDeveloper ב 11 לדצמבר 2012 #

הבקשה לא מגיע לסקריפט. ניסיתי כמה פעמים

avatar ענה intval ב 11 לדצמבר 2012 #

ומה נרשם בלוגים עבור המקרים שבהם הבקשה שלא מגיעה ?

avatar ענה intval ב 11 לדצמבר 2012 #

אפשר לנסות להוסיף את התנאי הבא:

# unless the request is for a valid file (image, js, css, etc.), send to bootstrap
   if (!-e $request_filename)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }

avatar ענה PHPDeveloper ב 11 לדצמבר 2012 #

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2012/12/11 15:21:41 [emerg] 3128#0: open() "/var/run/nginx.pid" failed (13: Permission denied)

avatar ענה PHPDeveloper ב 11 לדצמבר 2012 #

יש מצב שזה קשור לפאנל שפתחתי? ISPCONFIG אני מקבל בלוגים בקשות שיוצאות ממערכת של ISPCONFIG.. אין לי קשר אליהן.

ניסיתי לעשות ריסטרט לNGINX וקיבלתי מה ששלחתי למעלה ^

avatar ענה intval ב 12 לדצמבר 2012 #

יש מצב שזה קשור. אני לא יודע אם הפאנל משנה הרשאות על דברים או לא,
אבל אם אתה מתחבר דרך הקונסול, אתה תמיד יכול לעשות ריסטרט לשרת בתור root

sudo service nginx restart

או אם אתה בקונסול כבר בתור root, אז בלי ה sudo

avatar ענה PHPDeveloper ב 13 לדצמבר 2012 #

מתברר שגם בAPACHE2 זה לא ממש עובד..

כתבתי קובץ HTACCESS עם הקודים האלה:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]


וזה גם כן לא ניגש לשום קונטרולר דרך הINDEX - מוביל אותי לדף 404 בדיוק כמו בNGINX


אגב, הידרתי היום את הקודים של PHP5.5 הגירסה החדשה (לא מומלצת לשימוש לפי הארגון בגלל שהיא אלפא), איך אני יכול לחבר אותה עם אפצ'י? השתמשתי במודל מתאים העניין שהמודל הזה ישן ולא מצאתי באינטרנט שום דבר שקשור להידור מודל חדש בין אפצ'י לPHP

avatar ענה intval ב 13 לדצמבר 2012 #

בוא נלך שלב שלב ונסיים קודם עם מה יש בלוגים של nginx
כאשר אתה לא מצליח להגיע לסקריפט שלך.

avatar ענה PHPDeveloper ב 14 לדצמבר 2012 #

אחרי שעשיתי פירמוט למחשב שלי והתקנתי הכל מחדש (UBUNTU LTS 12.04) השגיאה שונתה - עכשיו זה 500. יש לי הרגשה שזה קשור לסקריפט שלי?

2012/12/13 16:01:37 [error] 3231#0: *11 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 192.168.0.104, server: nginx, request: "GET /index.php/controller HTTP/1.1", host: "192.168.0.100:8080"
2012/12/13 16:01:46 [error] 3231#0: *14 rewrite or internal redirection cycle while internally redirecting to "/index.html", client: 192.168.0.104, server: nginx, request: "GET /index.php/Master HTTP/1.1", host: "192.168.0.100:8080"

avatar ענה PHPDeveloper ב 14 לדצמבר 2012 #

טוב עכשיו סידרתי בקונפיגורציה שזה יריץ גם קבצי PHP, זה הריץ רק HTML.
זה מוביל אותי עכשיו ישירות לINDEX.PHP בכל פעם כשאני ניגש לנתיב כלשהו.. אני חושב שיש לנו התקדמות.
אני מקבל ארור של PHP שאומר שהוא לא מזהה את האובייקט של הקונטרולר כי הוא לא קולט אותו משום מה מURL:

Fatal error: Class 'Http:Controller' not found in /usr/share/nginx/www/framework/Routes/Controllers.php on line 14

avatar ענה intval ב 14 לדצמבר 2012 #

מעולה. זה הייתה הבעיה: איך לגרום לכל הבקשות תמיד להגיע ל index.php.
הנושא הזה מבחינתי סגור.
עכשיו אפשר לפתוח שאלה חדשה שבה תשאל מה שאתה רוצה על הקוד שלך :)

avatar ענה PHPDeveloper ב 14 לדצמבר 2012 #

תודה אלכס! אפתח תכף.